/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package negocios;

import acceso_datos.AdministradorDB;
import acceso_datos.CoordinadorDB;
import acceso_datos.OperadorDB;
import acceso_datos.ResponsableEntidadDB;
import datos.Administrador;
import datos.Coordinador;
import datos.Operador;
import datos.ResponsableEntidad;
import datos.Usuario;
import exceptions.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author miguesaca
 */
public class GestorUsuarios<T extends Usuario> {

    //T operador1;
    //T operador2;
    private T usuario;
    private Alfanumero alfaNumero;
    HashMap<String, T> listaUsuario = new HashMap<String, T>();

    public GestorUsuarios(T usuario) throws SQLException {
        alfaNumero = new Alfanumero();
        //operador1=t1 ;
        //operador2=t2 ;
        this.usuario = usuario;

        cargarDatos();
    }

//    public T getOperador() {
//        return usuario;
//    }
//
//    public void setOperador(T operador) {
//        this.usuario = operador;
//    }
    public void cargarDatos() throws SQLException {


        if (usuario instanceof Operador) {
            OperadorDB operadorDb = new OperadorDB();
            listaUsuario = (HashMap<String, T>) operadorDb.listar();
        }
        if (usuario instanceof Administrador) {
            AdministradorDB administradorDB = new AdministradorDB();
            listaUsuario = (HashMap<String, T>) administradorDB.listar();
        }
        if (usuario instanceof Coordinador) {
            CoordinadorDB coordinadorDB = new CoordinadorDB();
            listaUsuario = (HashMap<String, T>) coordinadorDB.listar();
        }
        if (usuario instanceof ResponsableEntidad) {
            ResponsableEntidadDB responsableEntidadDB = new ResponsableEntidadDB();
            listaUsuario = (HashMap<String, T>) responsableEntidadDB.listar();
        }








    }

    public void insertar(T usuario) throws UsuarioException, AlfanumericoException, SQLException {

        alfaNumero.esCedula(usuario.getCedula());
        if (listaUsuario.containsKey(usuario.getCedula())) {
            if (usuario instanceof Operador) {
                throw new OperadorException("Operador ya  Existente");
            }
            if (usuario instanceof Administrador) {
                throw new AdministradorException("Administrador ya Existe");
            }
            if (usuario instanceof Coordinador) {
                throw new CoordinadorException("Coordinador ya existe");
            }
            if (usuario instanceof ResponsableEntidad) {
                throw new ResponsableEntidadException("Responsable de la entidad ya Existe");
            }
        }


        if (usuario instanceof Operador) {
            OperadorDB odb=new OperadorDB();
            odb.grabar((Operador) usuario);
        }
        if (usuario instanceof Administrador) {
            AdministradorDB odb=new AdministradorDB();
            odb.grabar((Administrador) usuario);
        }
        if (usuario instanceof Coordinador) {
            CoordinadorDB odb=new CoordinadorDB();
            odb.grabar((Coordinador) usuario);
        }
        if (usuario instanceof ResponsableEntidad) {
            ResponsableEntidadDB odb=new ResponsableEntidadDB();
            odb.grabar((ResponsableEntidad) usuario);
        }

        this.usuario = usuario;
        listaUsuario.put(usuario.getCedula(), usuario);

    }

    public void modificar(T usuario) {
        this.usuario = usuario;
        listaUsuario.put(usuario.getCedula(), usuario);
    }

    public T buscar(String cedula) throws UsuarioException {

        if (listaUsuario.containsKey(cedula)) {

//            if (usuario instanceof Operador) {
//                throw new OperadorException("Operador no  Existente");
//            }
//            if (usuario instanceof Administrador) {
//                throw new AdministradorException("Administrador no Existe");
//            }
//            if (usuario instanceof Coordinador) {
//                throw new CoordinadorException("Coordinador no existe");
//            }
//            if (usuario instanceof ResponsableEntidad) {
//                throw new ResponsableEntidadException("Responsable de la entidad no Existe");
//            }
            return listaUsuario.get(cedula);
        }
        throw new UsuarioException("No existe");


    }

    public void eliminar(String cedula) throws UsuarioException {
        buscar(cedula);
        listaUsuario.remove(cedula);
    }

    public DefaultTableModel tablaModelo() {
        Object nameColumns[] = {"nombreUsuario", "cedula", "nombre", "apellido", "telefono", "direccion"};
        DefaultTableModel miTableModel = new DefaultTableModel(nameColumns, 0);
        for (T value : listaUsuario.values()) {
            Object nuevaFila[] = {value.getClass().getName(), value.getCedula(), value.getNombre(), value.getApellido(), value.getTelefono(), value.getDireccion()};
            miTableModel.addRow(nuevaFila);
        }

        return miTableModel;
    }
}
